<?php

/**
 * 페이징 클래스
 *
 * @param string $table 테이블명
 * @param int $pageno 페이지번호
 * @paran string $type admin|user 태그형식
 * @param string $where where구문(생략가능)
 * @param string $order order구문(생략가능)
 * @param string $extraParams 추가 파라메터(생략가능)
 * @param int $limit 한페이지에 보여줄 개수(생략가능)
 * @param int $linkSize 한페이지에 보여줄 링크 개수(생략가능)
 * @author cwsong
 * @since 0.3
 */
class EpartPaging {

    var $table; //사용할 테이블
    var $pageno; //페이지번호
    var $type; //페이징태그 유형 admin|user
    var $total = 0; //토탈
    var $rowStart; //시작로우
    var $limit; //한번에 가져오는 로우개수(한페이지에 출력할 로우개수)
    var $linkSize; //페이지링크블럭 사이즈
    var $linkFirst = 1; //처음페이지 = 1페이지
    var $linkLast; //마지막 페이지
    var $linkStart; //현재 링크블럭에 보여질 첫번째 페이지
    var $linkEnd; //현재 링크블럭에 보여질 마지막 페이지
    var $prev; //이전블럭
    var $next; //다음블럭
    var $where = ""; //where 문자열
    var $order = ""; //order 문자열
    var $adminPagingTag = "";
    var $userPagingTag = "";
    var $result = array(); //로우데이터
    var $extraParams = ""; //추가파라메터

    /**
     * 생성자
     *
     * @param string $table 테이블명
     * @param int $pageno 페이지번호
     * @paran string $type admin|user 태그형식
     * @param string $where where구문(생략가능)
     * @param string $order order구문(생략가능)
     * @param string $extraParams 추가 파라메터(생략가능)
     * @param int $limit 한페이지에 보여줄 개수(생략가능)
     * @param int $linkSize 한페이지에 보여줄 링크 개수(생략가능)
     * @author cwsong
     * @since 0.3
     */
    public function EpartPaging($table = null, $pageno = 1, $type = 'admin', $where = "", $order = "", $extraParams = "", $limit = 10, $linkSize = 10) {

        if (is_null($table) || empty($table)) {
            wp_die("페이징할 테이블이름이 누락되었습니다.");
        }
        $this->table = $table;
        $this->pageno = $pageno;
        $this->type = $type;
        $this->where = $where;
        $this->order = $order;
        $this->extraParams = $extraParams;
        $this->limit = $limit;
        $this->linkSize = $linkSize;

        $this->setup_total();
        $this->setup_vars();
        $this->setup_result();

        switch ($type) {
            case 'admin':
                $this->setup_admin_paging_tag();
                break;
            case 'user':
                $this->setup_user_paging_tag();
                break;
        }
    }

    //변수 세팅
    private function setup_vars() {

        $this->rowStart = $this->pageno == 1 ? 0 : $this->limit * ($this->pageno - 1);

        //시작페이지 링크
        if ($this->pageno / $this->linkSize <= 1) {
            $this->linkStart = 1;
        } else {
            $this->linkStart = floor(($this->pageno - 1) / $this->linkSize) * $this->linkSize + 1;
        }
        //마지막 페이지링크
        $this->linkLast = ceil($this->total / $this->limit);

        //보여지는 링크중 마지막페이지
        if ($this->linkStart + $this->linkSize - 1 >= $this->linkLast) {
            $this->linkEnd = $this->linkLast;
        } else {
            $this->linkEnd = $this->linkStart + $this->linkSize - 1;
        }

        //이전
        $this->prev = $this->linkStart - 1 <= 0 ? 1 : $this->linkStart - 1;
        //다음
        $this->next = $this->linkEnd + 1 >= $this->linkLast ? $this->linkLast : $this->linkEnd + 1;
    }

    //토탈
    private function setup_total() {
        global $wpdb;
        $totalQuery = "SELECT COUNT(*) FROM " . $this->table . " " . $this->where;
        //$this->total = $wpdb->get_var($wpdb->prepare($totalQuery));
        $this->total = $wpdb->get_var($totalQuery, 0, 0); //컬럼번호, 로우번호
    }

    //rows
    private function setup_result() {
        global $wpdb;
        $limitRules = " LIMIT " . $this->rowStart . ", " . $this->limit;
        $query = "SELECT * FROM " . $this->table . " " . $this->where . " " . $this->order . $limitRules;        
        $this->result = $wpdb->get_results($query);
    }

    //관리자단 페이징 태그생성
    private function setup_admin_paging_tag() {

        $tag = $this->make_admin_text_link("처음", $this->linkFirst);

        if ($this->linkFirst != $this->linkStart) {
            $tag .= $this->make_admin_text_link("이전", $this->prev);
        }

        if ($this->total > 0) {
            for ($i = $this->linkStart; $i <= $this->linkEnd; $i++) {
                if ($this->pageno == $i) {
                    $tag .= '<span class="current-page">[' . $i . ']</span>';
                } else {
                    $tag .= $this->make_admin_text_link($i, $i);
                }
            }
        }

        if ($this->linkLast != $this->linkEnd) {
            $tag .= $this->make_admin_text_link("다음", $this->next);
        }
        $tag .= $this->make_admin_text_link("마지막", $this->linkLast);

        $this->adminPagingTag = $tag;
    }

    //html생성
    private function make_admin_text_link($text = "", $pageno = 0) {
        if (empty($text)) {
            wp_die("링크생성 인자가 잘못 전달되었습니다.");
        }
        if($this->extraParams){
            return ' <a href="?' . $this->extraParams . '&pageno=' . $pageno . '">' . $text . '</a> ';
        }else{
            return ' <a href="?pageno=' . $pageno . '">' . $text . '</a> ';
        }
    }

    //사용자단 페이징 태그
    private function setup_user_paging_tag() {
        $tag = $this->make_user_text_link("처음", $this->linkFirst);

        if ($this->linkFirst != $this->linkStart) {
            $tag .= $this->make_user_text_link("이전", $this->prev);
        }

        if ($this->total > 0) {
            for ($i = $this->linkStart; $i <= $this->linkEnd; $i++) {
                if ($this->pageno == $i) {
                    $tag .= '<span class="current-page">[' . $i . ']</span>';
                } else {
                    $tag .= $this->make_user_text_link($i, $i);
                }
            }
        }

        if ($this->linkLast != $this->linkEnd) {
            $tag .= $this->make_user_text_link("다음", $this->next);
        }
        $tag .= $this->make_user_text_link("마지막", $this->linkLast);

        $this->userPagingTag = $tag;
    }

    private function make_user_text_link($text = "", $pageno = 0){

        if (empty($text)) {
            wp_die("링크생성 인자가 잘못 전달되었습니다.");
        }
        if($this->extraParams){
            return ' <a href="'.ebbs_get_bbs_url().'/pageno/'.$pageno.'/' . $this->extraParams . '">' . $text . '</a> ';
        }else{
            return ' <a href="'.ebbs_get_bbs_url().'/pageno/'.$pageno.'">' . $text . '</a> ';
        }
    }

    /**
     * 로우데이터 배열을 반환한다.
     *
     * @since 0.3
     * @return array 로우데이터
     */
    public function getResult() {
        return $this->result;
    }

    /**
     * 관리자단 페이징 태그를 반환한다.
     *
     * @since 0.3
     * @return string 텍스트형식 페이징 태그
     */
    public function getAdminPagingTag() {
        return $this->adminPagingTag;
    }

    /**
     * 사용자단 페이징 태그를 반환한다.
     *
     * @since 0.3
     * @return string
     */
    public function getUserPagingTag() {
        return $this->userPagingTag;
    }

    /**
     * 로우 총 개수를 반환한다.
     *
     * @since 0.3
     * @return int 로우 총 개수
     */
    public function getTotal() {
        return $this->total;
    }

}

?>
